package com.baofu.paycore.common.utils;

import com.baofu.paycore.common.constant.PayCoreConstant;
import com.baofu.paycore.common.exception.PayCoreBizException;
import com.baofu.paycore.service.facade.enums.PayCoreErrorCode;
import com.baofu.paycore.service.facade.enums.ServiceCodeEnum;
import com.system.commons.sequence.redis.SequenceFacade;
import lombok.extern.slf4j.Slf4j;

/**
 * 统一支付订单号生成工具类
 * <p>
 * </p>
 * User: kwl Date: 2016/6/2 ProjectName: paycore Version: 5.0.0
 */
@Slf4j
public class PayNoGenerateUtil {

    /**
     * payNo生成服务
     * <p>
     * payNo生成规则：
     * yyMMddHHmmss(12位) + 3位服务器IP + 6位随机数 + 2位服务码编号 + 2位系统编码
     * + 2位分库代码 + 2位分表代码 + 3位系统版本号 = 32位支付订单号
     * </p>
     *
     * @param serviceCode          服务编码
     * @return                     统一支付订单号PayNo
     */
    public static String payNoGenerate(SequenceFacade sequenceFacade, String serviceCode){
        ServiceCodeEnum code = ServiceCodeEnum.explain(serviceCode);
        if (code == null) {
            log.error("暂不支持此业务：{}", serviceCode);
            throw new PayCoreBizException(PayCoreErrorCode.NOT_IN_SERVICE);
        }
        return sequenceFacade.getUniqueSeq(code.getNumber() + PayCoreConstant.DB_DEFAULT_NO + PayCoreConstant.TABLE_DEFAULT_NO);
    }

}
